home *** CD-ROM | disk | FTP | other *** search
- /*
- File: MemCtr.cpp
-
- Contains: Implementation of ODMemContainer class.
-
- Owned by: Paul Hartenstine
-
- Copyright: © 1993 - 1996 by Apple Computer, Inc., all rights reserved.
-
- Change History (most recent first):
-
- <5> 8/13/96 DM 1376080: TempSuppressFatalBentoError
- spelling
- <4> 5/24/96 jpa 1246074: SOM_CATCH --> SOM_TRY..SOM_ENDTRY
- <3> 5/23/96 DH 1344338: Force quit of document when
- dragging 'Bad' file or Container. Turned
- off fatal Bento errors for Open and Create
- container operations.
-
- To Do:
- In Progress:
-
- */
-
- #define ODMemContainer_Class_Source
-
- #define VARIABLE_MACROS
-
- #include <MemCtr.xih>
-
- #ifndef _PLFMDEF_
- #include "PlfmDef.h"
- #endif
-
- #ifndef SOM_ODStorageSystem_xh
- #include <ODStor.xh>
- #endif
-
- #ifndef _MEMHDR_
- #include "MemHdr.h"
- #endif
-
- #ifndef _TARGTHDR_
- #include "TargtHdr.h"
- #endif
-
- #ifndef __CM_API__
- #include "CMAPI.h"
- #endif
-
- #ifndef _EXCEPT_
- #include "Except.h"
- #endif
-
- #ifndef _ODNEW_
- #include <ODNew.h>
- #endif
-
- #ifndef _BENTODEF_
- #include "BentoDef.h"
- #endif
-
- #ifndef _SESSHDR_
- #include "SessHdr.h"
- #endif
-
- #ifndef _BENTOSUPPRESS_
- #include <BentoSuppress.h>
- #endif
-
- #pragma segment ODMemContainer
-
- //==============================================================================
- // ODMemContainer
- //==============================================================================
-
- //------------------------------------------------------------------------------
- // ODMemContainer: ~ODMemContainer
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODMemContainersomUninit(ODMemContainer *somSelf)
- {
- ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
- ODMemContainerMethodDebug("ODMemContainer","somUninit");
-
- #ifdef DebugRefCount
- printf("~ODMemContainer %x CMContainer %x RefCount %d\n", somSelf, _fCMContainer, _fRefCount);
- fflush(stdout);
- #endif
-
- TRY{
- Environment *ev = somGetGlobalEnvironment ();
-
- if (_fCMContainer != kODNULL)
- somSelf->Close(ev);
-
- if (_fHandlers != kODNULL)
- delete _fHandlers;
-
- if (_fName != kODNULL)
- DisposeIText(_fName);
- }CATCH_ALL{
- // Ignore any errors
- }ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // ODMemContainer: InitContainer
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODMemContainerInitContainer(ODMemContainer *somSelf, Environment *ev,
- ODStorageSystem* storage, ODContainerID* id)
- {
- ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
- ODMemContainerMethodDebug("ODMemContainer","InitContainer");
-
- SOM_TRY
-
- /* Moved from somInit. SOM itself sets fields to zero
- _fCMContainer = kODNULL;
- _fHandlers = kODNULL;
- _fName = kODNULL;
- */
-
- ODMemContainer_parent_ODBentoContainer_InitContainer(somSelf, ev, storage, id);
-
- _fHandlers = new(somSelf->GetHeap(ev)) ODMemBentoHandlers(somSelf->GetCMSession(ev),
- *((ODHandle*) id->_buffer));
- _fHandlers->Initialize();
-
- _fName = CreateIText(0);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // ODMemContainer: GetName
- //------------------------------------------------------------------------------
-
- SOM_Scope ODContainerName SOMLINK ODMemContainerGetName(ODMemContainer *somSelf, Environment *ev)
- {
- ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
- ODMemContainerMethodDebug("ODMemContainer","GetName");
-
- return *_fName;
- }
-
- //------------------------------------------------------------------------------
- // ODMemContainer: SetName
- //------------------------------------------------------------------------------
-
- SOM_Scope void SOMLINK ODMemContainerSetName(ODMemContainer *somSelf, Environment *ev,
- ODContainerName* name)
- {
- ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
- ODMemContainerMethodDebug("ODMemContainer","SetName");
-
- SOM_TRY
-
- if (_fName != kODNULL) {
- DisposeIText(_fName);
- }
- _fName = CopyIText(name);
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- }
-
- //------------------------------------------------------------------------------
- // ODMemContainer: Create
- //------------------------------------------------------------------------------
-
- SOM_Scope ODContainer* SOMLINK ODMemContainerCreate(ODMemContainer *somSelf, Environment *ev)
- {
- ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
- ODMemContainerMethodDebug("ODMemContainer","Create");
-
- SOM_TRY
-
- if (_fCMContainer == kODNULL) {
-
- CMSession cmSession = somSelf->GetCMSession(ev);
-
- CMSetMetaHandler(cmSession,
- (CMGlobalName)CMTargetHandlersTypeName,
- targetContainerMetahandler);
-
- {
- TempSuppressFatalBentoError temp;
-
- _fCMContainer = CMOpenNewContainer(cmSession,
- _fHandlers,
- (CMGlobalName) kODBentoMemoryTypeName,
- (CMContainerUseMode)(kCMWriting),
- 1, 0);
- }
- if (_fCMContainer == kODNULL)
- THROW(kODErrCannotCreateContainer);
- ODSessionRestoreCMAllocReserve(_fCMContainer);
-
- }
- return somSelf;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return somSelf;
- }
-
- //------------------------------------------------------------------------------
- // ODMemContainer: Open
- //------------------------------------------------------------------------------
-
- SOM_Scope ODContainer* SOMLINK ODMemContainerOpen(ODMemContainer *somSelf, Environment *ev)
- {
- ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
- ODMemContainerMethodDebug("ODMemContainer","Open");
-
- SOM_TRY
-
- if (_fCMContainer == kODNULL) {
-
- CMSession cmSession = somSelf->GetCMSession(ev);
-
- CMSetMetaHandler(cmSession,
- (CMGlobalName)CMTargetHandlersTypeName,
- targetContainerMetahandler);
-
- {
- TempSuppressFatalBentoError temp;
-
- _fCMContainer = CMOpenNewContainer(cmSession,
- _fHandlers,
- (CMGlobalName) kODBentoMemoryTypeName,
- (CMContainerUseMode)(kCMUpdateByAppend),
- 1, 0);
- }
- if (_fCMContainer == kODNULL)
- THROW(kODErrCannotOpenContainer);
-
- ODSessionRestoreCMAllocReserve(_fCMContainer);
- }
- return somSelf;
-
- SOM_CATCH_ALL
- SOM_ENDTRY
- return somSelf;
- }
-
- //------------------------------------------------------------------------------
- // ODMemContainer: Close
- //------------------------------------------------------------------------------
-
- SOM_Scope ODContainer* SOMLINK ODMemContainerClose(ODMemContainer *somSelf, Environment *ev)
- {
- ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
- ODMemContainerMethodDebug("ODMemContainer","Close");
-
- if (_fCMContainer != kODNULL) {
- SOM_TRY
- ODSessionMustHaveCMAllocReserve(_fCMContainer);
- if (somSelf->GetDirtyFlag(ev) != kODFalse)
- CMCloseContainer(_fCMContainer);
- else
- CMAbortContainer(_fCMContainer);
- SOM_CATCH_ALL
- if (ErrorCode() == kODErrBentoErr)
- SetErrorCode(kODErrFatalContainerError);
- SOM_ENDTRY
- _fCMContainer = kODNULL;
- }
-
- return ODMemContainer_parent_ODBentoContainer_Close(somSelf, ev);
- }
-
- //------------------------------------------------------------------------------
- // ODMemContainer: Purge
- //------------------------------------------------------------------------------
-
- SOM_Scope ODSize SOMLINK ODMemContainerPurge(ODMemContainer *somSelf, Environment *ev,
- ODSize size)
- {
- ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
- ODMemContainerMethodDebug("ODMemContainer","Purge");
-
- ODSize freed = 0; ODVolatile(freed);
-
- SOM_TRY
- freed = parent_Purge(somSelf, ev, size);
- SOM_CATCH_ALL
- WARN("Error %ld trying to purge in ODMemContainerPurge",ErrorCode());
- SetErrorCode(kODNoError); // Eat the exception; Purge should not
- // propagate it because clients function
- // fine whether memory was purged or not.
- SOM_ENDTRY
-
- return freed;
- }
-
- //------------------------------------------------------------------------------
- // ODMemContainer: GetCMContainer
- //------------------------------------------------------------------------------
-
- SOM_Scope CMContainer SOMLINK ODMemContainerGetCMContainer(ODMemContainer *somSelf, Environment *ev)
- {
- ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
- ODMemContainerMethodDebug("ODMemContainer","GetCMContainer");
-
- return _fCMContainer;
- }
-
- //------------------------------------------------------------------------------
- // ODMemContainer: GetHandlers
- //------------------------------------------------------------------------------
-
- SOM_Scope ODBentoHandlers* SOMLINK ODMemContainerGetHandlers(ODMemContainer *somSelf, Environment *ev)
- {
- ODMemContainerData *somThis = ODMemContainerGetData(somSelf);
- ODMemContainerMethodDebug("ODMemContainer","GetHandlers");
-
- return _fHandlers;
- }
-